﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Utiles.Persistencia;
using EntidadesDeNegocio;
using System.Data.SqlClient;
using Utiles.Excepcion;

namespace PersistenciaSql
{
    public class BrokerProduccion:Broker
    {
        public override void Insertar(ObjetoPersistente obj)
        {
            int oid = ObtenerUltimoOid() + 1;
            Produccion prod = (Produccion)obj;
            SqlConnection conn = ConexionBDManejador.CreaConexion();
            string sql = @"Insert into Produccion (Oid,DisenoProduccion,CantidadSolicitada,CantidadProducida,FechaInicioProduccion,FechaFinProduccion) " +
                        " values (@Oid,@DisenoProduccion,@CantidadSolicitada,@CantidadProducida,@FechaInicioProduccion,@FechaFinProduccion)";
            SqlCommand comm = new SqlCommand(sql, conn);
            comm.Parameters.Add("@Oid", System.Data.SqlDbType.Int).Value = oid;
            comm.Parameters.Add("@DisenoProduccion", System.Data.SqlDbType.Int).Value = prod.DisenoProduccion.Oid;
            comm.Parameters.Add("@CantidadSolicitada", System.Data.SqlDbType.Int).Value = prod.CantidadSolicitada;
            comm.Parameters.Add("@CantidadProducida", System.Data.SqlDbType.Int).Value = prod.CantidadProducida;          
            comm.Parameters.Add("@FechaInicioProduccion", System.Data.SqlDbType.DateTime).Value = prod.FechaInicioProduccion;
            comm.Parameters.Add("@FechaFinProduccion", System.Data.SqlDbType.DateTime).Value = prod.FechaFinProduccion;          
            try
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error al insertar producción: " + ex.Message);
            }
            finally
            {
                conn.Close();
            }

        }

        public override void Actualizar(ObjetoPersistente obj)
        {
            string sql = @"Update Produccion set " +
                          "DisenoProduccion= @DisenoProduccion " +
                          " ,CantidadSolicitada = @CantidadSolicitada"+
                          " ,CantidadProducida = @CantidadProducida" +                          
                          " ,FechaInicioProduccion = @FechaInicioProduccion "+
                          " ,FechaFinProduccion = @FechaFinProduccion " +
                          " Where Oid = @Oid ";
            SqlConnection conn = ConexionBDManejador.CreaConexion();
            SqlCommand comm = new SqlCommand(sql, conn);
            Produccion prod = (Produccion)obj;
            comm.Parameters.Add("@Oid", System.Data.SqlDbType.Int).Value = prod.Oid;
            comm.Parameters.Add("@DisenoProduccion", System.Data.SqlDbType.Int).Value = prod.DisenoProduccion.Oid;
            comm.Parameters.Add("@CantidadSolicitada", System.Data.SqlDbType.Int).Value = prod.CantidadSolicitada;
            comm.Parameters.Add("@CantidadProducida", System.Data.SqlDbType.Int).Value = prod.CantidadProducida;
            comm.Parameters.Add("@FechaInicioProduccion", System.Data.SqlDbType.DateTime).Value = prod.FechaInicioProduccion;
            comm.Parameters.Add("@FechaFinProduccion", System.Data.SqlDbType.DateTime).Value = prod.FechaFinProduccion;    
            
            try
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error al actualizar producción: " + ex.Message);
            }
            finally
            {
                conn.Close();
            }
        }

        public override void Borrar(ObjetoPersistente obj)
        {
            string sql = "Delete From Produccion Where Oid= @Oid";
            SqlConnection conn = ConexionBDManejador.CreaConexion();
            SqlCommand comm = new SqlCommand(sql, conn);
            Produccion prod = (Produccion)obj;
            comm.Parameters.Add("@Oid", System.Data.SqlDbType.Int).Value = prod.Oid;            
            try
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error al borrar producción: " + ex.Message);
            }
            finally
            {
                conn.Close();
            }
        }

        public override List<ObjetoPersistente> SeleccionaTodo()
        {
            string sql = "Select * From Produccion";
            SqlConnection conn = ConexionBDManejador.CreaConexion();
            SqlCommand comm = new SqlCommand(sql, conn);            
            List<ObjetoPersistente> list = new List<ObjetoPersistente>();
            try
            {
                conn.Open();
                SqlDataReader reader = comm.ExecuteReader();
                while (reader.Read())
                {
                    
                    Produccion prod = new Produccion();
                    prod.Oid = reader.GetInt32(reader.GetOrdinal("Oid"));
                    prod.CantidadProducida = reader.GetInt32(reader.GetOrdinal("CantidadProducida"));
                    prod.CantidadSolicitada = reader.GetInt32(reader.GetOrdinal("CantidadSolicitada"));                    
                    prod.DisenoProduccion = Sistema.Instancia.ListaDisenos.Where(x => x.Oid == reader.GetInt32(reader.GetOrdinal("DisenoProduccion"))).First();
                    prod.FechaInicioProduccion = reader.GetDateTime(reader.GetOrdinal("FechaInicioProduccion"));
                    prod.FechaFinProduccion = reader.GetDateTime(reader.GetOrdinal("FechaFinProduccion"));                      
                    list.Add(prod);
                    
                }
                return list;
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error al seleccionar los componentes: " + ex.Message);
            }
            finally
            {
                conn.Close();
            }

        }

        public override ObjetoPersistente SeleccionaUno(ObjetoPersistente obj)
        {
            throw new NotImplementedException();
        }
        public override int ObtenerUltimoOid()
        {
            string sql = "Select Max(Oid) From Produccion";
            SqlConnection con = ConexionBDManejador.CreaConexion();
            SqlCommand comm = new SqlCommand(sql, con);
            try
            {
                con.Open();
                object o = comm.ExecuteScalar();
                if (o.ToString() == string.Empty)
                    return 0;
                else
                    return (int)o;
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error para obtener el ultimo id de la tabla producción: " + ex.Message);
            }
            finally
            {
                con.Close();
            }

        }
    }
}
